#!/usr/bin/env bash

usage() {
    echo -e "Build Jellyfin FFMPEG deb packages"
    echo -e " $0 <release> <arch>"
    echo -e "Releases:          Arches:"
    echo -e " * buster           * amd64"
    echo -e " * bullseye         * armhf"
    echo -e " * bookworm         * arm64"
    echo -e " * focal"
    echo -e " * jammy"
    echo -e " * lunar"
    echo -e " * mantic"
}

if [[ -z ${1} ]]; then
    usage
    exit 1
fi

cli_release="${1}"
case ${cli_release} in
    'buster')
        release="debian:buster"
        gcc_version="8"
        llvm_version="13"
    ;;
    'bullseye')
        release="debian:bullseye"
        gcc_version="10"
        llvm_version="13"
    ;;
    'bookworm')
        release="debian:bookworm"
        gcc_version="12"
        llvm_version="15"
    ;;
    'focal')
        release="ubuntu:focal"
        gcc_version="9"
        llvm_version="12"
    ;;
    'jammy')
        release="ubuntu:jammy"
        gcc_version="11"
        llvm_version="15"
    ;;
    'lunar')
        release="ubuntu:lunar"
        gcc_version="12"
        llvm_version="15"
    ;;
    'mantic')
        release="ubuntu:mantic"
        gcc_version="13"
        llvm_version="17"
    ;;
    *)
        echo "Invalid release."
        usage
        exit 1
    ;;
esac

cli_arch="${2}"
case ${cli_arch} in
    'amd64')
        arch="amd64"
    ;;
    'armhf')
        arch="armhf"
    ;;
    'arm64')
        arch="arm64"
    ;;
    *)
        echo "Invalid architecture."
        usage
        exit 1
    ;;
esac

set -o xtrace
set -o errexit

# Check for dependencies
for dep in docker make mmv; do
    command -v ${dep} &>/dev/null || { echo "The command '${dep}' is required."; exit 1; }
done

image_name="jellyfin-ffmpeg-build-${cli_release}"
package_temporary_dir="$( mktemp -d )"
current_user="$( whoami )"

# Trap cleanup for latter sections
cleanup() {
    # Clean up the Dockerfile
    make -f Dockerfile.make clean
    # Remove tempdir
    rm -rf "${package_temporary_dir}"
}
trap cleanup EXIT INT

# Generate Dockerfile
make -f Dockerfile.make DISTRO=${release} GCC_VER=${gcc_version} LLVM_VER=${llvm_version} ARCH=${arch}
# Set up the build environment docker image
docker build . -t "${image_name}"
# Build the APKs and copy out to ${package_temporary_dir}
docker run --rm -e "RELEASE=${release}" -v "${package_temporary_dir}:/dist" "${image_name}"
# If no 3rd parameter was specified, move APKs to parent directory
if [[ -z ${3} ]]; then
    path="../bin"
else
    path="${3}"
fi
mkdir ${path} &>/dev/null || true
mmv "${package_temporary_dir}/deb/*.deb" "${path}/#1.deb"
mmv "${package_temporary_dir}/deb/*_${arch}.*" "${path}/#1-${cli_release}_${arch}.#2"
